//<p>给定&nbsp;<code>n</code> 个非负整数表示每个宽度为 <code>1</code> 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1：</strong></p>
//
//<p><img src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/rainwatertrap.png" style="height: 161px; width: 412px;" /></p>
//
//<pre>
//<strong>输入：</strong>height = [0,1,0,2,1,0,1,3,2,1,2,1]
//<strong>输出：</strong>6
//<strong>解释：</strong>上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。 
//</pre>
//
//<p><strong>示例 2：</strong></p>
//
//<pre>
//<strong>输入：</strong>height = [4,2,0,3,2,5]
//<strong>输出：</strong>9
//</pre>
//
//<p>&nbsp;</p>
//
//<p><strong>提示：</strong></p>
//
//<ul>
//	<li><code>n == height.length</code></li>
//	<li><code>1 &lt;= n &lt;= 2 * 10<sup>4</sup></code></li>
//	<li><code>0 &lt;= height[i] &lt;= 10<sup>5</sup></code></li>
//</ul>
//<div><div>Related Topics</div><div><li>栈</li><li>数组</li><li>双指针</li><li>动态规划</li><li>单调栈</li></div></div><br><div><li>👍 3438</li><li>👎 0</li></div>

package com.rising.leetcode.editor.cn;

/**
 * 接雨水
 * @author DY Rising
 * @date 2022-05-11 20:28:19
 */
public class P42_TrappingRainWater{
    public static void main(String[] args) {
        //测试代码
        Solution solution = new P42_TrappingRainWater().new Solution();
        System.out.println(solution.trap(new int[] {0,1,0,2,1,0,1,3,2,1,2,1}));
    }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int trap(int[] height) {
        int sum = 0;
        int leftIndex = 0,rightIndex = height.length - 1,leftMax = 0, rightMax = 0;

        while (leftIndex != rightIndex) {
            leftMax = Math.max(leftMax, height[leftIndex]);
            rightMax = Math.max(rightMax, height[rightIndex]);
            //此时leftMax 一定 小于 rightMax
            if (height[leftIndex] < height[rightIndex]) {
                sum += leftMax - height[leftIndex];
                leftIndex++;
                continue;
            }
            //此时leftMax 一定 大于等于 rightMax
            if (height[leftIndex] >= height[rightIndex]) {
                sum += rightMax - height[rightIndex];
                rightIndex--;
                continue;
            }
        }

        return sum;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
